import axios from "axios";
import store from "../store";
import router from "../router";
const request = axios.create({
  baseURL: "http://geek.itheima.net/v1_0/",
});

// 添加请求拦截器  发请求之前执行
request.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么  统一给header添加token

    /**
     * 需求:
     * 有token
     * 不是登录.注册接口
     * 采取添加haders的token
     */

    if (store.state.user.token && config.url !== "authorizations") {
      // config.headers 是个对象: {} => 追加不是赋值
      config.headers.Authorization = `Bearer ${store.state.user.token}`;
    }
    return config;
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器v 请求发送之后,后端响应了执行 拦截器先拿到后台的response数据
request.interceptors.response.use(
  function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么 简化返回给页面的数据
    const _data = {
      status: response.status,
      data: response.data.data,
    };
    return _data;
  },
  async function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    const loginPath = `/login?redirectUrl=${router.currentRoute.path}`;
    try {
      // 处理401情况,是否需要更新token
      if (error.response && error.response.status === 401) {
        /**
         * 思路：
         * 1） 没有登录=》没有token
         * 跳转回登录页面（带上上次访问页面的地址）
         *
         * 2） 已经登录（核心）=》有token=》{token:发请求, refresh_token：token失效，更新时使用}
         * 1. token过期了，refresh_token没有过期 =》使用refresh_token发请求，更新过期token=》重新发送上次401的请求
         * 2. token过期了，refresh_token过期了 =》跳转回登录页面（带上上次访问页面的地址）
         */
        // 1） 没有登录=》没有token
        // 从store获取token
        const { user } = store.state;
        if (!user.token || !user.refresh_token) {
          router.replace(loginPath);
          // 中断请求，并抛出错误
          return Promise.reject(error);
        }
        // 2） 已经登录（核心）=》有token=》{token:发请求, refresh_token：token失效，更新时使用}
        const { data } = await request({
          url: "authorizations",
          method: "put",
          headers: {
            Authorization: `Bearer ${user.refresh_token}`,
          },
        });
        console.log("获取到的新token：", data);
        store.commit("setToken", {
          token: data.token, // 存新的token
          refresh_token: user.refresh_token,
        });
        // 重点：重新发送401的请求a
        return request(error.config);
      }
    } catch (error) {
      // token过期了，refresh_token过期了 =》跳转回登录页面（带上上次访问页面的地址）
      router.replace(loginPath);
      // 中断请求，并抛出错误
      return Promise.reject(error);
    }

    // return Promise.reject(error)
  }
);

export default request;
